/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.javahispano.javacup.tacticas_aceptadas.maxtor.org.javahispano.javacup.modelo.mio.servicios;

import org.javahispano.javacup.tacticas_aceptadas.maxtor.org.javahispano.javacup.modelo.mio.*;

import java.util.*;
import org.javahispano.javacup.modelo.*;


/**
 *
 * @author Administrador
 */
public class EvaluadorServiceImpl implements IEvaluadorService {


    
    public RespuestaSituacion evaluar(SituacionPartido s, DatosPartido datos) {
        RespuestaSituacion res = new RespuestaSituacion();
        
        Posicion balon = s.balon();
        
        VectorFis balonAnterior = datos.getBalonAnterior();
        VectorFis balonActual = new VectorFis();
        balonActual.setDestino(new double[]{s.balon().getX(), s.balon().getY(), s.alturaBalon()});
        balonActual.setOrigen( (balonAnterior!=null && balonAnterior.getDestino()!=null) ?
        			balonAnterior.getDestino() : balonActual.getDestino());
        
        Posicion[] misJugadores = s.misJugadores();
        Posicion[] rivales = s.rivales();
        JugadorDetalle[] detalleRivales = s.detalleJugadoresRivales();
        JugadorDetalle[] detalleMisJugadores = s.detalleMisJugadores();


        
        
        ArrayList<Circulo> circulosPase = new ArrayList<Circulo>();
        
        int [] puedenRematar = s.puedenRematar();
        
        Collection desmarcados 		= UtilEvaluador.getIndicesDesmarcados(s.balon(), misJugadores, rivales); 
        Collection<Pase> listaPases = UtilEvaluador.getPases(circulosPase, desmarcados, puedenRematar, misJugadores, detalleMisJugadores, rivales, detalleRivales);
        Pase paseSeleccionado 		= UtilEvaluador.seleccionarPase(listaPases, balon, misJugadores, rivales, detalleMisJugadores, detalleRivales, Constantes.centroArcoSup); 
        Posicion [] intercepciones 	= UtilEvaluador.getIntercepcionesBalon(balonActual, misJugadores, detalleMisJugadores);
        Posicion [] intercepcionesRival	= UtilEvaluador.getIntercepcionesBalon(balonActual, rivales, detalleRivales);
        
        Collection<Disparo> disparos = new ArrayList<Disparo>();
        for (int i : s.puedenRematar()) {
             if (s.misJugadores()[i].distancia(Constantes.centroArcoSup) < 25) {
                Posicion rematador = s.misJugadores()[i];
                JugadorDetalle detalleRematador = s.detalleMisJugadores()[i];
                disparos = UtilEvaluador.getDisparos(rematador, i, detalleRematador, rematador, null, intercepciones, null);
             }
        }
        
        res.setGanando(s.golesPropios() > s.golesRival());
        res.setVectorBalon(balonActual);
        res.setDesmarcados(desmarcados);
        res.setPase(paseSeleccionado);
        res.setCirculosPase(circulosPase);
        res.setIntercepcionesBalon(intercepciones);
        res.setDisparos(disparos);
         
         int[] it = s.iteracionesParaRematar();
         for (int i:it) { if (it[i]>0) {res.setAtacando(1); break;}
         } 
         it = s.iteracionesParaRematarRival();
         for (int i:it) { if (it[i]>0) {res.setAtacando(-1); break;}
         }
        	 
         Movimiento movimientos = new Movimiento();

         int indiceReceptor = datos.getIndiceReceptor();
         res.setIndiceReceptor(indiceReceptor);
         if (indiceReceptor>-1 && intercepciones[indiceReceptor]!=null)
        	 movimientos.setReceptor(intercepciones[indiceReceptor]);
         
         if (paseSeleccionado!=null) {
        	 Posicion pasador = misJugadores[paseSeleccionado.getIndicePasador()];
        	 Posicion destinoBalon = paseSeleccionado.getPuntoSeleccionado();
        	 movimientos.setPasador(UtilEvaluador.getMovimientoPasador(pasador, destinoBalon, rivales));
        	 movimientos.setReceptor(destinoBalon);
        	 res.setIndiceReceptor(paseSeleccionado.getIndiceReceptor());
         }
         
         
         movimientos.setCentrales(UtilEvaluador.getMovimientoCentrales(UtilEvaluador.INDICE_CENTRALES, misJugadores, rivales, balon));
         movimientos.setLaterales(UtilEvaluador.getMovimientoLaterales(UtilEvaluador.INDICE_LATERALES, datos.isAtacando(), balon, misJugadores, rivales));
         
         movimientos.setGeneral(UtilEvaluador.getMovimientoGeneral(misJugadores, rivales, detalleMisJugadores, detalleRivales, intercepciones, intercepcionesRival, balonActual, datos.isAtacando(), datos, s.iteracionesParaRematar()));
         movimientos.setPortero(UtilEvaluador.getMovimientoPortero((intercepciones!=null&&intercepciones[0]!=null)?intercepciones[0]:s.balon()));
         
         
         res.setMovimientos(movimientos);
         return res;
    }

}
